// 模块的整合
import 'babel-polyfill';
import Base from './lottery/base.js';
import Timer from './lottery/timer.js';
import Calculate from './lottery/calculate.js';
import Interface from './lottery/interface.js';
import $ from 'jquery';

//深度拷贝
const copyProperties=function(target,source){
    for(let key of Reflect.ownKeys(source)){  //拿到源对象上的所有属性。有时候object对象拿不到的东西，用relfect就能拿到
        if(key!=='constructor'&&key!=='prototype'&&key!=='name'){  //过滤。判断：不是构造函数、原型或者name时才去进行下面的步骤
            let desc=Object.getOwnPropertyDescriptor(source,key); // 获取指定对象的自身属性描述符。从原对象上拿到函数的明文
            Object.defineProperty(target,key,desc); //复制到目标对象上
        }
    }
}

//多重继承函数--注意这里实现类的多重继承的逻辑
const mix=function(...mixins){  //rest参数
    class Mix{}  //声明一个空的类
    for(let mixin of mixins){
        copyProperties(Mix,mixin);  //深度拷贝
        copyProperties(Mix.prototype,mixin.prototype);  //原型也要拷贝
    }
    return Mix
}

//通过深度拷贝完成一个各个模块功能的多重实现。最终这类类称为上面引入的那四个类的综合体
class Lottery extends mix(Base,Calculate,Interface,Timer){  //混合，js代码复用的一种方式
    constructor(name='syy',cname='11选5',issue='**',state='**'){
        super();    //继承时，super一定要放在最前面
        this.name=name;                 //区分多个彩种
        this.cname=cname;               //中文名称
        this.issue=issue;               //期号
        this.state=state;               //状态
        this.el='';                     //选择器
        this.omit=new Map();            //遗漏
        this.open_code=new Set();       //开奖号码
        this.open_code_list=new Set();  //开奖记录
        this.play_list=new Map();       //玩法列表
        this.number=new Set();          //选号
        this.issue_el='#curr_issue';    //当前选号的期号的选择器
        this.countdown_el='#countdown'; //倒计时的选择器
        this.state_el='.state_el';      //状态的选择器
        this.cart_el='.codelist';       //购物车的选择器
        this.omit_el='';                //遗漏的选择器
        this.cur_play='r5';             //当前的默认玩法，这里默认是“任五”
        this.initPlayList();            //初始化
        this.initNumber();
        this.updateState();             //更新状态
        this.initEvent();               //事件的初始化
    }


    //新增两个方法

    /**
     * [updateState 状态更新]
     * @return {[type]} [description]
     */
    updateState(){
        let self=this;
        this.getState().then(function(res){     // getState()是接口里的方法
            self.issue=res.issue;               //拿到期号
            self.end_time=res.end_time;         //拿到截止时间
            self.state=res.state;               //拿到当前状态
            $(self.issue_el).text(res.issue);   //更新期号
            self.countdown(res.end_time,function(time){ //更新倒计时
                $(self.countdown_el).html(time)
            },function(){ //重新获取
                setTimeout(function () {
                    self.updateState(); //重新获取最新的销售状态
                    self.getOmit(self.issue).then(function(res){    //获取当前最新的遗漏

                    });
                    self.getOpenCode(self.issue).then(function(res){ //更新奖号

                    })
                }, 500);
            })
        })
    }

    /**
     * [initEvent 初始化事件]
     * @return {[type]} [description]
     */
    initEvent(){
        let self=this;
        $('#plays').on('click','li',self.changePlayNav.bind(self)); //玩法切换
        $('.boll-list').on('click','.btn-boll',self.toggleCodeActive.bind(self));   //号码的选中
        $('#confirm_sel_code').on('click',self.addCode.bind(self));     //添加号码
        $('.dxjo').on('click','li',self.assistHandle.bind(self));       //操作区（全、大、小、奇、偶）
        $('.qkmethod').on('click','.btn-middle',self.getRandomCode.bind(self)); //随机号码
    }
}

export default Lottery;
